.TITLE ERROR .IDENT /12.01/ ; ; Copyright (c) 1995 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; P. J. BEZEREDI 08-JAN-82 ; ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; S. C. ADAMS ; J. R. KAUFFMAN ; J. M. LAWLER ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY: ; ; K. L. NOEL ; ; Modified for RSX-11M-PLUS VERSION 4.6 by: ; ; D. Carroll 18-Oct-1995 12.01 ; DC404 - Include PSECT statement to allow ICB pool to ; be fully extended by SYSGEN ; ; ; ERROR LOGGING ; ; ; MACRO LIBRARY CALLS ; .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$ EPKDF$ ;DEFINE ERROR PACKET OFFSETS .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;+ ; **-$BMSET-SET THE UNIT'S ACTIVE INTERRUPT BIT IN THE SCB ; ; THIS COROUTINE RAISES THE PROCESSOR PRIORITY TO SEVEN AND ; SETS THE INTERRUPT ACTIVE BIT IN THE SCB, RECALLS THE ; CALLER TO START THE FUNCTION AND THEN ALLOWS INTERRUPTS. ; ; INPUTS: ; ; R4=ADDRESS OF THE SCB ; ; OUTPUTS: ; ; THE INTERRUPT ACTIVE BIT (S2.ACT) IS SET ;- $BMSET::MTPS #PR7 ;LOCK OUT INTERRUPTS BIS #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT IS ACTIVE CALL @(SP)+ ;;;RECALL THE CALLER MTPS #0 ;;;ALLOW INTERRUPTS BMXIT: RETURN ;EXIT ;+ ; **-$DTOER-LOG DEVICE TIMEOUTS ; **-$DVTMO-LOG DEVICE TIMEOUTS FOR OVERLAPPED DEVICES ; ; THIS ROUTINE IS CALLED TO LOG A DEVICE TIMEOUT ERROR CONDITION. ; IF ENTRY IS AT $DTOER THE CONTROLLER'S INTERRUPT ENABLE BIT IS ; RESET AND THE PROCESSOR PRIORITY IS DROPPED TO ZERO. IF A ; DIAGNOSTIC FUNCTION WAS IN PROGRESS, NO ERROR IS LOGGED. ; ; INPUTS: ; ; R2=ADDRESS OF A BLOCK OF REGISTERS TO LOG (MUST BE THE ; CSR ADDRESS IF KS.MBC IS SET) ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ; OUTPUTS: ; ; R0=IE.DNR&377 (DEVICE NOT READY) ; R1=ADDRESS OF I/O PACKET ; C=0 IF FUNCTION WAS NOT A USER MODE DIAGNOSTIC FUNTION. ; THE ERROR LOG PACKET IS FILLED AND THE SCB CONTAINS ; A POINTER TO IT. THE ERROR IN PROGRESS FLAG IS SET ; IN THE SCB. ; C=1 IF FUNCTION WAS A USER MODE DIAGNOSTIC FUNCTION. IN THIS ; CASE ONLY THE INTERRUPT ENABLE BIT IS CLEARED AND THE ; PRIORITY IS LOWERED TO ZERO. ;- .ENABL LSB $DTOER::MOV (R2),$DVSAV ;;;SAVE CONTENTS OF CSR BIC #100,(R2) ;;;DISABLE THE DEVICE INTERRUPT MTPS #0 ;;;ALLOW INTERRUPTS BR 5$ ; $DVTMO::MOV (R2),$DVSAV ;SAVE CONTENTS OF CSR 5$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR CODE BIC #S2.ACT,S.ST2(R4) ;SET INTERRUPT INACTIVE MOV S.PKT(R4),R1 ;PICK UP THE ADDRESS OF THE I/O PACKET SEC ;ASSUME IT IS A DIAGNOSTIC FUNCTION BITB #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION? BNE BMXIT ;IF NE YES .IF DF E$$LOG .IFTF ; DF E$$LOG MOV #$DVTM2,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON CALL $MPDC2 ;MAP AND CALL CODE IN SECOND ;DIRECTIVE COMMON RETURN ;+ ; **-$DVERR-LOG A DEVICE ERROR ; **-$DVCER-LOG A DEVICE ERROR (ALTERNATE NAME) ; ; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKET ; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BE ; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERROR ; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSO ; BE SAVED. ; ; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THE ; OPERATION IS SUCCESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE ; ERROR WHEN THE I/O OPERATION IS TERMINATED. ; ; INPUTS: ; ; R2=ADDRESS OF THE BLOCK OF REGISTERS TO LOG (MUST BE THE ; CSR ADDRESS IF KS.MBC IS SET) ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ; OUTPUTS: ; ; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG ; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKET ; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET. ; ; NOTE: ALL REGISTERS ARE PRESERVED. ;- .IFTF $DVERR:: ;LOG DEVICE ERROR $DVCER:: ;LOG DEVICE ERROR .IFT MOV #$DVER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON BR 10$ ;BRANCH TO COMMON PROCESSING ;+ ; **-$LOGER-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT) ; ; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN ERROR LOG ; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT. ; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING ; IN THE NECESSARY DATA INFORMATION. ; ; INPUTS: ; ; R1=LENGTH OF DATA TO BE LOGGED IN BYTES ; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT) ; R5=UCB ADDRESS ; ; OUTPUTS: ; ; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASON ; C=0 IF ERROR CAN BE LOGGED ; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET ; R3=ADDRESS OF ERROR LOG PACKET ; ; R4 AND R5 ARE PRESERVED ; R0, R2 AND R3 ARE DESTROYED ; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKET ;- .IFTF $LOGER:: .IFT MOV #$LGER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON BR 10$ ;BRANCH TO COMMON PROCESSING ;+ ; **-$FNERL-FINISH ERROR LOGGING PROCESS ; ; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARY ; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF A ; MID-TRANSFER ERROR. ; ; INPUTS: ; R0=FIRST I/O STATUS WORD ; R2=STARTING AND FINAL ERROR RETRY COUNTS ; R3=ERROR LOG PACKET ADDRESS IF R4=0 ; R4=SCB ADDRESS OR ZERO ; R5=UCB ADDRESS ; ; OUTPUTS: ; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER. ; THE ERROR IN PROGRESS BIT IS CLEARED. ; ; R1 AND R2 ARE DESTROYED. ;- .IFTF $FNERL:: ;FINISH ERROR LOGGING PROCESS .IFT MOV #$FERL1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON BR 10$ ;BRANCH TO COMMON PROCESSING ;+ ; **-$CRPKT-CREATE ERROR LOG PACKET ; ; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THE ; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OF ; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE, ; POWER FAIL RECOVERY, OR DEVICE ERROR. ; ; INPUTS: ; ; R0=PACKET CODE ; R1=LENGTH OF DATA SUBPACKET ; R2=CONTROL MASK WORD ; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKET ; R4=TCB ADDRESS (FOR TASK SUBPACKET) ; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET) ; ; OUTPUTS: ; ; R0=UNCHANGED ; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATA ; R2=UNCHANGED ; R3=BEGINNING ADDRESS OF PACKET ; R4=UNCHANGED ; R5=UNCHANGED ; ; C=0 IF A PACKET WAS CREATED ; C=1 IF A PACKET WAS NOT CREATED ; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKET ; ; OUTPUT PACKET FORMAT: ; ; +-----------------------------------------------+ ; | RESERVED FOR PACKET LINK WORD | ; +-----------------------------------------------+ ; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) | ; +-----------------------------------------------+ ; | HEADER SUBPACKET | ; . . ; ; | | ; +-----------------------------------------------+ ; | OTHER SUBPACKETS | ; . . ; ; | | ; +-----------------------------------------------+ ;- .IFTF $CRPKT:: .IFT MOV #$CRPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON BR 10$ ;BRANCH TO COMMON PROCESSING ;+ ; **-$CREQU-CREATE AND QUEUE ERROR LOG PACKET ; ; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPKT ; AND $QUPKT. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPKT AND IT'S ; OUTPUT IS THE SAME AS THAT FROM $QUPKT. IF THE PACKET CANNOT BE ; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE WITH CARRY SET. ; ; KISAR6 MAPPING IS PRESERVED ;- .IFTF $CREQU:: .IFT MOV #$CREQ1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON BR 10$ ;BRANCH TO COMMON PROCESSING ;+ ; **-$QUPKT-QUEUE ERROR LOG PACKET ; ; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NO ; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY. ; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS ; REQUESTED IMMEDIATLY. ; ; INPUTS: ; ; R3=POINTER TO PACKET FOR INSERTION IN QUEUE ; ; OUTPUTS: ; ; R4 AND R5 ARE PRESERVED ; ALL OTHER REGISTERS ARE DESTROYED ;- .IFTF $QUPKT:: .IFT MOV #$QUPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON BR 10$ ;BRANCH TO COMMON PROCESSING ;+ ; **-$QERMV-REMOVE ENTRY FROM ERROR LOG QUEUE ; ; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERS ; IT INTO A USER BUFFER. ; ; INPUTS: ; ; R4=LENGTH OF USER BUFFER ; R5=ADDRESS OF USER BUFFER ; ; OUTPUTS: ; ; R1=LENGTH OF PACKET ; R4=UNCHANGED ; R5=UNCHANGED ; ; C=0 PACKET WAS REMOVED SUCCESSFULLY ; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THE ; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH. ;- .IFTF $QERMV:: .IFT MOV #$QRMV1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON 10$: CALL $MPDC2 ;MAP AND CALL CODE IN SECOND ;DIRECTIVE COMMON .IFF SEC .IFTF RETURN .ENDC ;E$$LOG .DSABL LSB ;+ ; **-$NSIER-UNEXPECTED (NONSENSE) INTERRUPT ERRORS ; ; THIS ROUTINE IDENTIFIES THE INTERRUPTING VECTOR AND LOGS ; THE ERROR. ; ; INPUTS: ; ; @(SP)=BITS 06:04 OF THE UNUSED VECTOR NUMBER ; PS=VECTOR ID (MOD 20) IN CONDITION CODE BITS ; ; OUTPUTS: ; ; AN ERROR LOG PACKET IS ALLOCATED AND QUEUED TO THE ; ERROR LOGGER. ;- .IF DF E$$NSI $NSIER::MFPS -(SP) ;;;SAVE THE VECTOR ID (MODULO 20) .IF DF M$$PRO ; ; THIS INTERRUPT COULD BE THE ONE FROM THE IIST AS PART OF CPU ; STARTUP. ; ; THE CRITERION FOR DETERMINING IS THIS IS A NORMAL NONSENSE INTERRUPT ; AS DISTINCT FROM A CPU STARTUP IS THE STATE OF THE MEMORY MANAGEMENT ; UNIT. IF MAPPING IS ENABLED, THEN THIS IS ASSUMED A NORMAL NONSENSE ; INTERRUPT. IF MAPPING IS NOT ENABLED, THEN A JUMP TO CPU STARTUP IS ; PERFORMED. ; BIT #1,SR0 ;;;IS MAPPING ENABLED? BNE 5$ ;;;IF NE YES CALLR $CPBGN ;;;NO, START UP THIS CPU .ENDC 5$: INCB $NSI ;;;NSI IN PROGRESS? BMI 7$ ;;;DON'T ALLOW COUNTER TO WRAP BNE 10$ ;;;IF NE YES BIT #ES.LOG,$ERFLA ;;;LOGGING ERRORS? BNE 20$ ;;;IF NE YES 7$: DECB $NSI ;;;RESTORE COUNTER 10$: CMP (SP)+,(SP)+ ;;;CLEAR THE STACK RTI ;;;RETURN ; ; THE NONSENSE INTERRUPT HAS NOT INTERRUPTED THE HANDLING OF A PREVIOUS ; NONSENSE INTERRUPT, SO GO AHEAD AND PROCESS IT. ; 20$: BIC #177760,(SP) ;;;ISOLATE THE VECTOR ID IN THE PS MOV (SP)+,$VID ;;;SAVE THE VECTOR ID. BIS @(SP)+,$VID ;;;ADD IN THE GROUP BIAS MOV (SP),$OPC ;;;SAVE PREINTERRUPT PC MOV 2(SP),$OPS ;;;SAVE PREINTERRUPT PS CALL $INTSV,PR7 ;;;SWITCH STACKS MOV $ERLFK,R4 ;;;GET FORK BLOCK ADDRESS CALL $FORK0 ;;;AND FORK INC $ERRSQ ;COUNT THE ERROR MOV #E$CCPU+<400*E$SINT>,R0 ;GET THE ERROR CODE MOV #3*2,R1 ;THE BUFFER IS 3 WORDS (6 BYTES) MOV #SM.HDR!SM.DAT!SM.DAC,R2 ;SET SUBPACKET FLAGS MOV #$VID,R3 ;GET ADDRESS OF THE DATA CALL $CREQU ; CREATE AND QUEUE PACKET 30$: MOVB #-1,$NSI ;RESET RECURSION COUNTER RETURN ; .ENDC ;E$$NSI .END